package com.fzk.core.btree;

import com.fzk.core.lru.LruList;
import com.fzk.log.Logger;

/**
 * 基于LRU实现的页缓存机制
 *
 * @author zhike.feng
 * @datetime 2023-06-15 22:00:01
 */
public abstract class PageCache extends LruList<Integer, Page> {
    public PageCache(int capacity) {
        super(capacity);
    }

    /**
     * 插入lru缓存队列成功时的回调
     */
    @Override
    protected void putCallback(Integer pageIdx, Page page) {
        page.isInCache = true;
        Logger.debug(String.format("页面放入缓存, pageIdx: %d", pageIdx));
    }

    /**
     * 当移除队尾时，回调此方法
     * 可在此释放资源
     */
    @Override
    protected void removeCallback(Integer pageIdx, Page page) {
        page.isInCache = false;
        if (page.deleted) {
            // 删除的页面无需资源释放，即落盘
            Logger.debug(String.format("已经删除的页面pageIdx: %d从缓存移除", pageIdx));
            return;
        }
        Logger.debug(String.format("页面移除缓存, pageIdx: %d", pageIdx));
        // 页面未删除，需要释放资源，即将其落盘
        release(pageIdx, page);
    }

    /**
     * 资源释放回调，当缓存中的页面移除缓存时，且页面未删除将调用此方法落盘
     */
    protected abstract void release(Integer pageIdx, Page page);
}
